์ํํ ํ๋ก ํธ์๋ ์ค์๊ฐ ํ์ ์ ์ํ Operational Transformation ๊ตฌํ์ ๋ณต์ก์ฑ์ ํ๊ตฌํ๊ณ , ๊ธ๋ก๋ฒ ์ฌ์ฉ์์ ๊ฒฝํ์ ํฅ์์ํค์ธ์.
ํ๋ก ํธ์๋ ์ค์๊ฐ ํ์ : Operational Transformation ๋ง์คํฐํ๊ธฐ
์ค๋๋ ์ํธ ์ฐ๊ฒฐ๋ ๋์งํธ ํ๊ฒฝ์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํํ ์ค์๊ฐ ํ์ ๊ฒฝํ์ ๋ํ ์๊ตฌ๋ ๊ทธ ์ด๋ ๋๋ณด๋ค ๋์ต๋๋ค. ๋ฌธ์๋ฅผ ๊ณต๋ ํธ์งํ๋ , ์ธํฐํ์ด์ค๋ฅผ ํจ๊ป ๋์์ธํ๋ , ๊ณต์ ํ๋ก์ ํธ ๋ณด๋๋ฅผ ๊ด๋ฆฌํ๋ , ์ฌ์ฉ์๋ค์ ์ง๋ฆฌ์ ์์น์ ๊ด๊ณ์์ด ๋ณ๊ฒฝ ์ฌํญ์ด ์ฆ์ ๋ฐ์๋๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ์ด๋ฌํ ์ ๊ตํ ์์ค์ ์ํธ์์ฉ์ ๋ฌ์ฑํ๋ ๊ฒ์ ํนํ ํ๋ก ํธ์๋์์ ์๋นํ ๊ธฐ์ ์ ๊ณผ์ ๋ฅผ ์ ๊ธฐํฉ๋๋ค. ์ด ํฌ์คํธ์์๋ ๊ฐ๋ ฅํ ์ค์๊ฐ ํ์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ธ ์คํผ๋ ์ด์ ๋ ํธ๋์คํฌ๋ฉ์ด์ (Operational Transformation, OT)์ ํต์ฌ ๊ฐ๋ ๊ณผ ๊ตฌํ ์ ๋ต์ ๋ํด ์์ธํ ์์๋ด ๋๋ค.
๋์ ํธ์ง์ ๊ณผ์
์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ ๋์ผํ ํ ์คํธ๋ ๊ณต์ ๋์์ธ ์์๋ฅผ ํธ์งํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ์ด๋ฌํ ๋์ ์์ ์ ์ฒ๋ฆฌํ ์ ๊ตํ ๋ฉ์ปค๋์ฆ์ด ์๋ค๋ฉด ๋ถ์ผ์น์ ๋ฐ์ดํฐ ์์ค์ ๊ฑฐ์ ๋ถ๊ฐํผํฉ๋๋ค. ์ฌ์ฉ์ A๊ฐ ์ธ๋ฑ์ค 5์ ๋ฌธ์๋ฅผ ์ญ์ ํ๊ณ , ๋์์ ์ฌ์ฉ์ B๊ฐ ์ธ๋ฑ์ค 7์ ๋ฌธ์๋ฅผ ์ฝ์ ํ๋ค๋ฉด ์์คํ ์ ์ด๋ฌํ ์์ ์ ์ด๋ป๊ฒ ์กฐ์ ํด์ผ ํ ๊น์? ์ด๊ฒ์ด ๋ฐ๋ก OT๊ฐ ํด๊ฒฐํ๊ณ ์ ํ๋ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์ ๋๋ค.
๋ณ๊ฒฝ ์ฌํญ์ด ์์ฐจ์ ์ผ๋ก ์ ์ฉ๋๋ ์ ํต์ ์ธ ํด๋ผ์ด์ธํธ-์๋ฒ ๋ชจ๋ธ์ ์ค์๊ฐ ํ์ ํ๊ฒฝ์์๋ ์ ๋๋ก ์๋ํ์ง ์์ต๋๋ค. ๊ฐ ํด๋ผ์ด์ธํธ๋ ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํ๋ฉฐ, ์ค์ ์๋ฒ๋ก ์ ์ก๋ ํ ๋ค๋ฅธ ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ก ์ ํ๋์ด์ผ ํ๋ ์์ ์ ์์ฑํฉ๋๋ค. ์ด๋ฌํ ์์ ์ด ๋ค๋ฅธ ํด๋ผ์ด์ธํธ์ ๋์ฐฉํ๋ ์์๋ ๋ค๋ฅผ ์ ์์ผ๋ฉฐ, ์ ๋๋ก ์ฒ๋ฆฌ๋์ง ์์ผ๋ฉด ์ถฉ๋ํ๋ ์ํ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์คํผ๋ ์ด์ ๋ ํธ๋์คํฌ๋ฉ์ด์ ์ด๋ ๋ฌด์์ธ๊ฐ?
์คํผ๋ ์ด์ ๋ ํธ๋์คํฌ๋ฉ์ด์ ์ ๊ณต์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ํ ๋์ ์์ ์ด ๋ ๋ฆฝ์ ์ผ๋ก ๊ทธ๋ฆฌ๊ณ ์ ์ฌ์ ์ผ๋ก ์์์ ๋ง์ง ์๊ฒ ์์ฑ๋๋๋ผ๋ ๋ชจ๋ ๋ณต์ ๋ณธ์์ ์ผ๊ด๋ ์์๋ก ์ ์ฉ๋๋๋ก ๋ณด์ฅํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์ด์ ์ ์คํ๋ ์์ ์ ๊ธฐ๋ฐ์ผ๋ก ์์ ์ ๋ณํํจ์ผ๋ก์จ ์๋ ด(convergence) โ ์ฆ ๋ชจ๋ ๋ณต์ ๋ณธ์ด ๊ฒฐ๊ตญ ๋์ผํ ์ํ์ ๋๋ฌํ๋ค๋ ๋ณด์ฅ์ ์ ์งํฉ๋๋ค.
OT์ ํต์ฌ ์์ด๋์ด๋ ๋ณํ ํจ์ ์งํฉ์ ์ ์ํ๋ ๊ฒ์ ๋๋ค. ์์ OpB๊ฐ ์ด๋ฏธ ์์ OpA๋ฅผ ์ ์ฉํ ํด๋ผ์ด์ธํธ์ ๋์ฐฉํ๊ณ , OpB๊ฐ ํด๋ผ์ด์ธํธ์ OpA๊ฐ ์๋ ค์ง๊ธฐ ์ ์ ์์ฑ๋ ๊ฒฝ์ฐ, OT๋ OpB๊ฐ ์ ์ฉ๋ ๋ OpA ์ด์ ์ ์ ์ฉ๋ ๊ฒ๊ณผ ๋์ผํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋๋ก OpB๋ฅผ OpA์ ๋ํด ์ด๋ป๊ฒ ๋ณํํด์ผ ํ๋์ง๋ฅผ ์ ์ํฉ๋๋ค.
OT์ ํต์ฌ ๊ฐ๋
- ์์ (Operations): ๊ณต์ ๋ฐ์ดํฐ์ ์ ์ฉ๋๋ ๊ธฐ๋ณธ์ ์ธ ๋ณ๊ฒฝ ๋จ์์ ๋๋ค. ํ ์คํธ ํธ์ง์ ๊ฒฝ์ฐ ์์ ์ ์ฝ์ (๋ฌธ์, ์์น) ๋๋ ์ญ์ (์์น, ๋ฌธ์ ์)๊ฐ ๋ ์ ์์ต๋๋ค.
- ๋ณต์ ๋ณธ(Replicas): ๊ฐ ์ฌ์ฉ์์ ๊ณต์ ๋ฐ์ดํฐ ๋ก์ปฌ ์ฌ๋ณธ์ ๋ณต์ ๋ณธ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
- ์๋ ด(Convergence): ์์ ์ด ์์ ๋๊ณ ์ ์ฉ๋๋ ์์์ ๊ด๊ณ์์ด ๋ชจ๋ ๋ณต์ ๋ณธ์ด ๊ฒฐ๊ตญ ๋์ผํ ์ํ์ ๋๋ฌํ๋ ์์ฑ์ ๋๋ค.
- ๋ณํ ํจ์(Transformation Functions): OT์ ํต์ฌ์ผ๋ก, ์ด ํจ์๋ค์ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด ์ ํ ์์ ์ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ด์ค๋ ์์ ์ ์กฐ์ ํฉ๋๋ค. ๋ ์์ OpA์ OpB์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ์ ์ํฉ๋๋ค:
- OpA' = OpA.transform(OpB): OpA๋ฅผ OpB์ ๋ํด ๋ณํํฉ๋๋ค.
- OpB' = OpB.transform(OpA): OpB๋ฅผ OpA์ ๋ํด ๋ณํํฉ๋๋ค.
- ์ธ๊ณผ์ฑ(Causality): ์์ ๊ฐ์ ์์กด์ฑ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ง์ฝ OpB๊ฐ OpA์ ์ธ๊ณผ์ ์ผ๋ก ์์กดํ๋ค๋ฉด(์ฆ, OpB๊ฐ OpA ์ดํ์ ์์ฑ๋จ), ๊ทธ ์์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ณด์กด๋ฉ๋๋ค. ๊ทธ๋ฌ๋ OT๋ ์ฃผ๋ก ์์ ์ด ๋์์ ์ผ ๋ ๋ฐ์ํ๋ ์ถฉ๋์ ํด๊ฒฐํ๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค.
OT ์๋ ๋ฐฉ์: ๊ฐ๋จํ ์์
์จ๋ฆฌ์ค์ ๋ฐฅ ๋ ์ฌ์ฉ์๊ฐ ์ด๊ธฐ์ "Hello"๋ฅผ ํฌํจํ๋ ๋ฌธ์๋ฅผ ํธ์งํ๋ ๊ฐ๋จํ ํ ์คํธ ํธ์ง ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
์ด๊ธฐ ์ํ: "Hello"
์๋๋ฆฌ์ค:
- ์จ๋ฆฌ์ค๋ ์์น 5์ ' '๋ฅผ ์ฝ์ ํ๋ ค๊ณ ํฉ๋๋ค. ์์ OpA: insert(' ', 5).
- ๋ฐฅ์ ์์น 6์ '!'๋ฅผ ์ฝ์ ํ๋ ค๊ณ ํฉ๋๋ค. ์์ OpB: insert('!', 6).
์ด๋ฌํ ์์ ์ด ๊ฑฐ์ ๋์์ ์์ฑ๋์ด ๋ฐฅ์ ํด๋ผ์ด์ธํธ๊ฐ OpA๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ๋์ฐฉํ๊ณ , ์จ๋ฆฌ์ค์ ํด๋ผ์ด์ธํธ๋ OpA๋ฅผ ๋ฐ๊ธฐ ์ ์ OpB๋ฅผ ์ฒ๋ฆฌํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์จ๋ฆฌ์ค์ ๊ด์ :
- OpB ์์ : insert('!', 6). ๋ฌธ์๋ "Hello!"๊ฐ ๋ฉ๋๋ค.
- OpA ์์ : insert(' ', 5). ์ธ๋ฑ์ค 6์ '!'๊ฐ ์ฝ์ ๋์์ผ๋ฏ๋ก ์จ๋ฆฌ์ค๋ OpA๋ฅผ ๋ณํํด์ผ ํฉ๋๋ค. ์์น 5์์์ ์ฝ์ ์ ์ด์ ์์น 5์์ ์ผ์ด๋์ผ ํฉ๋๋ค (๋ฐฅ์ ์ฝ์ ์ ์จ๋ฆฌ์ค๊ฐ ์๋ํ ์ฝ์ ์ง์ ์ดํ์ธ ์ธ๋ฑ์ค 6์ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค).
- OpA' = insert(' ', 5). ์จ๋ฆฌ์ค๋ OpA'๋ฅผ ์ ์ฉํฉ๋๋ค. ๋ฌธ์๋ "Hello !"๊ฐ ๋ฉ๋๋ค.
๋ฐฅ์ ๊ด์ :
- OpA ์์ : insert(' ', 5). ๋ฌธ์๋ "Hello "๊ฐ ๋ฉ๋๋ค.
- OpB ์์ : insert('!', 6). ๋ฐฅ์ OpB๋ฅผ OpA์ ๋ํด ๋ณํํด์ผ ํฉ๋๋ค. ์จ๋ฆฌ์ค๋ ์์น 5์ ' '๋ฅผ ์ฝ์ ํ์ต๋๋ค. ๋ฐฅ์ ์์น 6์์์ ์ฝ์ ์ ์ด์ ์์น 6์ ์์ด์ผ ํฉ๋๋ค (์จ๋ฆฌ์ค์ ์ฝ์ ์ ๋ฐฅ์ด ์๋ํ ์ฝ์ ์ง์ ์ด์ ์ธ ์ธ๋ฑ์ค 5์ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค).
- OpB' = insert('!', 6). ๋ฐฅ์ OpB'๋ฅผ ์ ์ฉํฉ๋๋ค. ๋ฌธ์๋ "Hello !"๊ฐ ๋ฉ๋๋ค.
์ด ๊ฐ๋จํ ๊ฒฝ์ฐ, ๋ ์ฌ์ฉ์ ๋ชจ๋ ๋์ผํ ์ํ์ธ "Hello !"์ ๋๋ฌํฉ๋๋ค. ๋ณํ ํจ์๋ ๋์ ์์ ์ด ๋ก์ปฌ์์ ๋ค๋ฅธ ์์๋ก ์ ์ฉ๋๋๋ผ๋ ์ผ๊ด๋ ์ ์ญ ์ํ๋ฅผ ๋ง๋ค์ด๋์ต๋๋ค.
ํ๋ก ํธ์๋์์ ์คํผ๋ ์ด์ ๋ ํธ๋์คํฌ๋ฉ์ด์ ๊ตฌํํ๊ธฐ
ํ๋ก ํธ์๋์์ OT๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ์ฌ๋ฌ ํต์ฌ ๊ตฌ์ฑ ์์์ ๊ณ ๋ ค ์ฌํญ์ ํฌํจํฉ๋๋ค. ํต์ฌ ๋ก์ง์ ์ข ์ข ์๋ฒ๋ ์ ์ฉ ํ์ ์๋น์ค์ ์์ง๋ง, ํ๋ก ํธ์๋๋ ์์ ์ ์์ฑํ๊ณ , ๋ณํ๋ ์์ ์ ์ ์ฉํ๋ฉฐ, ์ค์๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ๋๋ก ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
1. ์์ ํํ ๋ฐ ์ง๋ ฌํ
์์ ์ ๋ช ํํ๊ณ ๋ชจํธํ์ง ์์ ํํ์ด ํ์ํฉ๋๋ค. ํ ์คํธ์ ๊ฒฝ์ฐ, ์ด๋ ์ข ์ข ๋ค์์ ํฌํจํฉ๋๋ค:
- ์ ํ(Type): 'insert' ๋๋ 'delete'.
- ์์น(Position): ์์ ์ด ๋ฐ์ํด์ผ ํ๋ ์ธ๋ฑ์ค.
- ๋ด์ฉ(Content) (์ฝ์ ์ฉ): ์ฝ์ ๋๋ ๋ฌธ์.
- ๊ธธ์ด(Length) (์ญ์ ์ฉ): ์ญ์ ํ ๋ฌธ์ ์.
- ํด๋ผ์ด์ธํธ ID(Client ID): ๋ค๋ฅธ ์ฌ์ฉ์์ ์์ ์ ๊ตฌ๋ณํ๊ธฐ ์ํจ.
- ์ํ์ค ๋ฒํธ/ํ์์คํฌํ(Sequence Number/Timestamp): ๋ถ๋ถ์ ์ธ ์์๋ฅผ ์ค์ ํ๊ธฐ ์ํจ.
์ด๋ฌํ ์์ ์ ์ผ๋ฐ์ ์ผ๋ก ๋คํธ์ํฌ ์ ์ก์ ์ํด ์ง๋ ฌํ๋ฉ๋๋ค(์: JSON ์ฌ์ฉ).
2. ๋ณํ ๋ก์ง
์ด๊ฒ์ OT์ ๊ฐ์ฅ ๋ณต์กํ ๋ถ๋ถ์ ๋๋ค. ํ ์คํธ ํธ์ง์ ๊ฒฝ์ฐ, ๋ณํ ํจ์๋ ์ฝ์ ๊ณผ ์ญ์ ๊ฐ์ ์ํธ ์์ฉ์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ฝ์ ์ด ๋ค๋ฅธ ์ฝ์ ๊ณผ, ์ฝ์ ์ด ์ญ์ ์, ์ญ์ ๊ฐ ๋ค๋ฅธ ์ญ์ ์ ์ด๋ป๊ฒ ์ํธ ์์ฉํ๋์ง๋ฅผ ์ ์ํ๋ ๊ฒ์ ๋๋ค.
์ฝ์ (InsX)์ ๋ค๋ฅธ ์ฝ์ (InsY)์ ๋ํด ๋ณํํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ด ์๋ค.
- InsX.transform(InsY):
- ๋ง์ฝ InsX์ ์์น๊ฐ InsY์ ์์น๋ณด๋ค ์์ผ๋ฉด, InsX์ ์์น๋ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
- ๋ง์ฝ InsX์ ์์น๊ฐ InsY์ ์์น๋ณด๋ค ํฌ๋ฉด, InsX์ ์์น๋ InsY๊ฐ ์ฝ์ ํ ๋ด์ฉ์ ๊ธธ์ด๋งํผ ์ฆ๊ฐํฉ๋๋ค.
- ๋ง์ฝ InsX์ ์์น๊ฐ InsY์ ์์น์ ๊ฐ๋ค๋ฉด, ์์๋ ์ด๋ ์์ ์ด ๋จผ์ ์์ฑ๋์๋์ง ๋๋ ๋์ ์ฒ๋ฆฌ ๊ท์น(์: ํด๋ผ์ด์ธํธ ID)์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. InsX๊ฐ ๋ ๋น ๋ฅด๋ค๋ฉด ์์น๋ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค. InsY๊ฐ ๋ ๋น ๋ฅด๋ค๋ฉด InsX์ ์์น๋ ์ฆ๊ฐํฉ๋๋ค.
๋ค๋ฅธ ์์ ์กฐํฉ์๋ ์ ์ฌํ ๋ก์ง์ด ์ ์ฉ๋ฉ๋๋ค. ๋ชจ๋ ์ฃ์ง ์ผ์ด์ค์ ๋ํด ์ด๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ๋ฉฐ ์ข ์ข ์๊ฒฉํ ํ ์คํธ๊ฐ ํ์ํฉ๋๋ค.
3. ์๋ฒ ์ธก vs. ํด๋ผ์ด์ธํธ ์ธก OT
OT ์๊ณ ๋ฆฌ์ฆ์ ์ ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์์ ๊ตฌํ๋ ์ ์์ง๋ง, ์ผ๋ฐ์ ์ธ ํจํด์ ์ค์ ์๋ฒ๊ฐ ์ด์ง์ ์ญํ ์ ํ๋ ๊ฒ์ ๋๋ค:
- ์ค์ ์ง์ค์ OT(Centralized OT): ๊ฐ ํด๋ผ์ด์ธํธ๋ ์์ ์ ์์ ์ ์๋ฒ๋ก ๋ณด๋ ๋๋ค. ์๋ฒ๋ OT ๋ก์ง์ ์ ์ฉํ์ฌ ๋ค์ด์ค๋ ์์ ์ ์ด๋ฏธ ์ฒ๋ฆฌํ๊ฑฐ๋ ๋ณธ ์์ ์ ๋ํด ๋ณํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์๋ฒ๋ ๋ณํ๋ ์์ ์ ๋ค๋ฅธ ๋ชจ๋ ํด๋ผ์ด์ธํธ์๊ฒ ๋ธ๋ก๋์บ์คํธํฉ๋๋ค. ์ด๋ ํด๋ผ์ด์ธํธ ๋ก์ง์ ๋จ์ํํ์ง๋ง ์๋ฒ๋ฅผ ๋ณ๋ชฉ ํ์๊ณผ ๋จ์ผ ์คํจ ์ง์ ์ผ๋ก ๋ง๋ญ๋๋ค.
- ๋ถ์ฐ/ํด๋ผ์ด์ธํธ ์ธก OT(Decentralized/Client-Side OT): ๊ฐ ํด๋ผ์ด์ธํธ๋ ์์ ์ ์ํ๋ฅผ ์ ์งํ๊ณ ๋ค์ด์ค๋ ์์ ์ ์ ์ฉํ๋ฉฐ, ์์ ์ ๊ธฐ๋ก์ ๋ํด ๋ณํํฉ๋๋ค. ์ด๋ ๊ด๋ฆฌํ๊ธฐ ๋ ๋ณต์กํ ์ ์์ง๋ง ๋ ํฐ ๋ณต์๋ ฅ๊ณผ ํ์ฅ์ฑ์ ์ ๊ณตํฉ๋๋ค. ShareDB์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ง์ถคํ ๊ตฌํ์ด ์ด๋ฅผ ์ฉ์ดํ๊ฒ ํ ์ ์์ต๋๋ค.
ํ๋ก ํธ์๋ ๊ตฌํ์ ๊ฒฝ์ฐ, ์ข ์ข ํ๋ก ํธ์๋๊ฐ ๋ก์ปฌ ์์ ๊ณผ ์ฌ์ฉ์ ์ํธ ์์ฉ์ ๊ด๋ฆฌํ๊ณ , ๋ฐฑ์๋ ์๋น์ค๊ฐ ์์ ์ ๋ณํ ๋ฐ ๋ฐฐํฌ๋ฅผ ์กฐ์ ํ๋ ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์์ด ์ฌ์ฉ๋ฉ๋๋ค.
4. ํ๋ก ํธ์๋ ํ๋ ์์ํฌ ํตํฉ
OT๋ฅผ React, Vue ๋๋ Angular์ ๊ฐ์ ํ๋์ ์ธ ํ๋ก ํธ์๋ ํ๋ ์์ํฌ์ ํตํฉํ๋ ค๋ฉด ์ ์คํ ์ํ ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. ๋ณํ๋ ์์ ์ด ๋์ฐฉํ๋ฉด ํ๋ก ํธ์๋์ ์ํ๊ฐ ๊ทธ์ ๋ฐ๋ผ ์ ๋ฐ์ดํธ๋์ด์ผ ํฉ๋๋ค. ์ด๋ ์ข ์ข ๋ค์์ ํฌํจํฉ๋๋ค:
- ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(State Management Libraries): ๊ณต์ ๋ฌธ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด Redux, Zustand, Vuex ๋๋ NgRx์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ(Immutable Data Structures): ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ๋ณ๊ฒฝ์ด ์๋ก์ด ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฏ๋ก ์ํ ์ ๋ฐ์ดํธ ๋ฐ ๋๋ฒ๊น ์ ๋จ์ํํ ์ ์์ต๋๋ค.
- ํจ์จ์ ์ธ UI ์ ๋ฐ์ดํธ(Efficient UI Updates): ํนํ ํฐ ๋ฌธ์์์ ๋น๋ฒํ๊ณ ์์ ๋ณ๊ฒฝ์ ์ฒ๋ฆฌํ ๋ UI ์ ๋ฐ์ดํธ๊ฐ ์ฑ๋ฅ์ ์ผ๋ก ์ฐ์ํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ๊ฐ์ ์คํฌ๋กค๋ง์ด๋ ๋ํ(diffing)๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
5. ์ฐ๊ฒฐ ๋ฌธ์ ์ฒ๋ฆฌ
์ค์๊ฐ ํ์ ์์ ๋คํธ์ํฌ ๋ถํ ๋ฐ ์ฐ๊ฒฐ ๋๊น์ ํํ ์ผ์ ๋๋ค. OT๋ ์ด์ ๋ํด ๊ฒฌ๊ณ ํด์ผ ํฉ๋๋ค:
- ์คํ๋ผ์ธ ํธ์ง(Offline Editing): ํด๋ผ์ด์ธํธ๋ ์คํ๋ผ์ธ ์ํ์์๋ ํธ์ง์ ๊ณ์ํ ์ ์์ด์ผ ํฉ๋๋ค. ์คํ๋ผ์ธ์์ ์์ฑ๋ ์์ ์ ๋ก์ปฌ์ ์ ์ฅ๋์๋ค๊ฐ ์ฐ๊ฒฐ์ด ๋ณต์๋๋ฉด ๋๊ธฐํ๋์ด์ผ ํฉ๋๋ค.
- ์กฐ์ (Reconciliation): ํด๋ผ์ด์ธํธ๊ฐ ๋ค์ ์ฐ๊ฒฐ๋๋ฉด ๋ก์ปฌ ์ํ๊ฐ ์๋ฒ์ ์ํ์ ๋ฌ๋ผ์ก์ ์ ์์ต๋๋ค. ๋ณด๋ฅ ์ค์ธ ์์ ์ ๋ค์ ์ ์ฉํ๊ณ ํด๋ผ์ด์ธํธ๊ฐ ์คํ๋ผ์ธ ์ํ์ผ ๋ ๋ฐ์ํ ๋ชจ๋ ์์ ์ ๋ํด ๋ณํํ๋ ์กฐ์ ํ๋ก์ธ์ค๊ฐ ํ์ํฉ๋๋ค.
- ์ถฉ๋ ํด๊ฒฐ ์ ๋ต(Conflict Resolution Strategies): OT๋ ์ถฉ๋์ ๋ฐฉ์งํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ์ง๋ง, ์ฃ์ง ์ผ์ด์ค๋ ๊ตฌํ์์ ๊ฒฐํจ์ผ๋ก ์ธํด ์ฌ์ ํ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ช ํํ ์ถฉ๋ ํด๊ฒฐ ์ ๋ต(์: ๋ง์ง๋ง ์ฐ๊ธฐ ์ฐ์ , ํน์ ๊ธฐ์ค์ ๋ฐ๋ฅธ ๋ณํฉ)์ ์ ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
OT์ ๋์ ๋ฐ ๋ณด์: CRDTs
OT๊ฐ ์์ญ ๋ ๋์ ์ค์๊ฐ ํ์ ์ ์ด์์ด์์ง๋ง, ํนํ ํ ์คํธ๊ฐ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๋ณต์กํ ์๋๋ฆฌ์ค์ ๋ํด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๊ธฐ๋ ์ ๋ช ๋๊ฒ ๋ณต์กํฉ๋๋ค. ๋์์ด์ ์ ์ ๋ ์ธ๊ธฐ๋ฅผ ์ป๊ณ ์๋ ์ ๊ทผ ๋ฐฉ์์ ์ถฉ๋ ์๋ ๋ณต์ ๋ฐ์ดํฐ ํ์ (Conflict-free Replicated Data Types, CRDTs)์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
CRDT๋ ๋ณต์กํ ๋ณํ ํจ์ ์์ด ์ต์ข ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋๋ก ์ค๊ณ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. ์์ ์ด ๊ตํ ๊ฐ๋ฅํ๊ฑฐ๋ ์์ฒด์ ์ผ๋ก ๋ณํฉ๋๋๋ก ๋ณด์ฅํ๋ ํน์ ์ํ์ ์์ฑ์ ํตํด ์ด๋ฅผ ๋ฌ์ฑํฉ๋๋ค.
OT์ CRDTs ๋น๊ต
์คํผ๋ ์ด์ ๋ ํธ๋์คํฌ๋ฉ์ด์ (OT):
- ์ฅ์ : ์์ ์ ๋ํ ์ธ๋ฐํ ์ ์ด๊ฐ ๊ฐ๋ฅํ๋ฉฐ, ํน์ ์ ํ์ ๋ฐ์ดํฐ์ ๋ํด ๋ ํจ์จ์ ์ผ ์ ์๊ณ , ํ ์คํธ ํธ์ง์ ๋ํด ๋๋ฆฌ ์ดํด๋๊ณ ์์ต๋๋ค.
- ๋จ์ : ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๊ธฐ๊ฐ ๊ทน๋๋ก ๋ณต์กํ๋ฉฐ, ํนํ ํ ์คํธ๊ฐ ์๋ ๋ฐ์ดํฐ๋ ๋ณต์กํ ์์ ์ ํ์ ๋ํด ๊ทธ๋ ์ต๋๋ค. ๋ฏธ๋ฌํ ๋ฒ๊ทธ์ ์ทจ์ฝํฉ๋๋ค.
์ถฉ๋ ์๋ ๋ณต์ ๋ฐ์ดํฐ ํ์ (CRDTs):
- ์ฅ์ : ๋ง์ ๋ฐ์ดํฐ ์ ํ์ ๋ํด ๊ตฌํ์ด ๋ ๊ฐ๋จํ๊ณ , ๋์์ฑ ๋ฐ ๋คํธ์ํฌ ๋ฌธ์ ๋ฅผ ๋ณธ์ง์ ์ผ๋ก ๋ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ๋ฉฐ, ๋ถ์ฐ ์ํคํ ์ฒ๋ฅผ ๋ ์ฝ๊ฒ ์ง์ํ ์ ์์ต๋๋ค.
- ๋จ์ : ๋๋ก๋ ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ๋ ํจ์จ์ ์ผ ์ ์๊ณ , ์ํ์ ๊ธฐ๋ฐ์ด ์ถ์์ ์ผ ์ ์์ผ๋ฉฐ, ์ผ๋ถ CRDT ๊ตฌํ์ ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ ๋์ญํญ์ ์๊ตฌํ ์ ์์ต๋๋ค.
๋ง์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ , ํนํ ๋จ์ํ ํ ์คํธ ํธ์ง์ ๋์ด์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ์๋์ ์ธ ๋จ์์ฑ๊ณผ ๊ฒฌ๊ณ ์ฑ ๋๋ฌธ์ CRDT๊ฐ ์ ํธ๋๋ ์ ํ์ด ๋๊ณ ์์ต๋๋ค. Yjs์ Automerge ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํฉํ ์ ์๋ ๊ฒฌ๊ณ ํ CRDT ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค.
๋ ๊ฐ์ง ์์๋ค์ ๊ฒฐํฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์์คํ ์ ๋ฐ์ดํฐ ํํ์ ์ํด CRDT๋ฅผ ์ฌ์ฉํ์ง๋ง, ํน์ ๊ณ ์์ค ์์ ์ด๋ UI ์ํธ ์์ฉ์ ์ํด OT์ ์ ์ฌํ ๊ฐ๋ ์ ํ์ฉํ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ์ถ์๋ฅผ ์ํ ์ค์ฉ์ ์ธ ๊ณ ๋ ค์ฌํญ
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ์ค์๊ฐ ํ์ ๊ธฐ๋ฅ์ ๊ตฌ์ถํ ๋, ํต์ฌ ์๊ณ ๋ฆฌ์ฆ ์ธ์ ์ฌ๋ฌ ์์๊ฐ ์ค์ํด์ง๋๋ค:
- ์ง์ฐ ์๊ฐ(Latency): ๋ค๋ฅธ ์ง๋ฆฌ์ ์์น์ ์ฌ์ฉ์๋ค์ ๋ค์ํ ์์ค์ ์ง์ฐ ์๊ฐ์ ๊ฒฝํํ ๊ฒ์ ๋๋ค. OT ๊ตฌํ(๋๋ CRDT ์ ํ)์ ์ง์ฐ ์๊ฐ์ ์ฒด๊ฐ ์ํฅ์ ์ต์ํํด์ผ ํฉ๋๋ค. ๋๊ด์ ์ ๋ฐ์ดํธ(์์ ์ ์ฆ์ ์ ์ฉํ๊ณ ์ถฉ๋ ์ ๋๋๋ฆฌ๋ ๊ฒ)์ ๊ฐ์ ๊ธฐ์ ์ด ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์๊ฐ๋ ๋ฐ ๋๊ธฐํ(Time Zones and Synchronization): OT๋ ์ฃผ๋ก ์์ ์์๋ฅผ ๋ค๋ฃจ์ง๋ง, ๊ฐ์ฌ ๋ฐ ๋๋ฒ๊น ์ ์ํด ์๊ฐ๋์ ๊ฑธ์ณ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก(์: UTC ์ฌ์ฉ) ํ์์คํฌํ๋ ์ํ์ค ๋ฒํธ๋ฅผ ๋ํ๋ด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๊ตญ์ ํ ๋ฐ ํ์งํ(Internationalization and Localization): ํ ์คํธ ํธ์ง์ ๊ฒฝ์ฐ, ์์ ์ด ๋ค๋ฅธ ๋ฌธ์ ์งํฉ, ์คํฌ๋ฆฝํธ(์: ์๋์ด๋ ํ๋ธ๋ฆฌ์ด์ ๊ฐ์ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์ฐ๋ ์ธ์ด) ๋ฐ ์ ๋ ฌ ๊ท์น์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋๋ก ๋ณด์ฅํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. OT์ ์์น ๊ธฐ๋ฐ ์์ ์ ๋ฐ์ดํธ ์ธ๋ฑ์ค๋ฟ๋ง ์๋๋ผ ์์ ํด๋ฌ์คํฐ(grapheme clusters)๋ฅผ ์ธ์ํด์ผ ํฉ๋๋ค.
- ํ์ฅ์ฑ(Scalability): ์ฌ์ฉ์ ๊ธฐ๋ฐ์ด ์ฑ์ฅํจ์ ๋ฐ๋ผ ์ค์๊ฐ ํ์ ์ ์ง์ํ๋ ๋ฐฑ์๋ ์ธํ๋ผ๋ ํ์ฅ๋์ด์ผ ํฉ๋๋ค. ์ด๋ ๋ถ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ฉ์์ง ํ ๋ฐ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ํฌํจํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ๊ฒฝํ ๋์์ธ(User Experience Design): ํ์ ํธ์ง ์ํ๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ช ํํ๊ฒ ์ ๋ฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋๊ฐ ํธ์ง ์ค์ธ์ง, ๋ณ๊ฒฝ ์ฌํญ์ด ์ธ์ ์ ์ฉ๋๋์ง, ์ถฉ๋์ด ์ด๋ป๊ฒ ํด๊ฒฐ๋๋์ง์ ๋ํ ์๊ฐ์ ์ ํธ๋ ์ฌ์ฉ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๋๊ตฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
OT๋ CRDT๋ฅผ ์ฒ์๋ถํฐ ๊ตฌํํ๋ ๊ฒ์ ์๋นํ ์์ ์ ๋๋ค. ๋คํํ๋, ๊ฐ๋ฐ์ ๊ฐ์ํํ ์ ์๋ ๋ช ๊ฐ์ง ์ฑ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค:
- ShareDB: ์คํผ๋ ์ด์ ๋ ํธ๋์คํฌ๋ฉ์ด์ ์ ์ฌ์ฉํ๋ ์ธ๊ธฐ ์๋ ์คํ ์์ค ๋ถ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ ์ค์๊ฐ ํ์ ์์ง์ ๋๋ค. ๋ค์ํ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์ ์ํ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค.
- Yjs: ๋งค์ฐ ์ฑ๋ฅ์ด ์ข๊ณ ์ ์ฐํ CRDT ๊ตฌํ์ผ๋ก, ๋ค์ํ ๋ฐ์ดํฐ ์ ํ๊ณผ ํ์ ์๋๋ฆฌ์ค๋ฅผ ์ง์ํฉ๋๋ค. ํ๋ก ํธ์๋ ํตํฉ์ ๋งค์ฐ ์ ํฉํฉ๋๋ค.
- Automerge: ํ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ๋ ์ฝ๊ฒ ๋ง๋๋ ๋ฐ ์ด์ ์ ๋ง์ถ ๋ ๋ค๋ฅธ ๊ฐ๋ ฅํ CRDT ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- ProseMirror: ํ์ ํธ์ง์ ์ํด ์คํผ๋ ์ด์ ๋ ํธ๋์คํฌ๋ฉ์ด์ ์ ํ์ฉํ๋ ๋ฆฌ์น ํ ์คํธ ์๋ํฐ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ํดํท์ ๋๋ค.
- Tiptap: ProseMirror๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ํค๋๋ฆฌ์ค ์๋ํฐ ํ๋ ์์ํฌ๋ก, ์ค์๊ฐ ํ์ ๋ ์ง์ํฉ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ ๋๋ ์ฑ์๋, ์ปค๋ฎค๋ํฐ ์ง์, ๋ฌธ์ํ, ๊ทธ๋ฆฌ๊ณ ํน์ ์ฌ์ฉ ์ฌ๋ก ๋ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ํ ์ ํฉ์ฑ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๊ฒฐ๋ก
ํ๋ก ํธ์๋ ์ค์๊ฐ ํ์ ์ ํ๋ ์น ๊ฐ๋ฐ์ ๋ณต์กํ์ง๋ง ๋ณด๋ ์๋ ๋ถ์ผ์ ๋๋ค. ์คํผ๋ ์ด์ ๋ ํธ๋์คํฌ๋ฉ์ด์ ์ ๊ตฌํํ๊ธฐ๋ ์ด๋ ต์ง๋ง, ์ฌ๋ฌ ๋์ ์ฌ์ฉ์ ๊ฐ์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ๊ฒฌ๊ณ ํ ํ๋ ์์ํฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์์ ๋ณํ์ ํต์ฌ ์๋ฆฌ, ๋ณํ ํจ์์ ์ ์คํ ๊ตฌํ, ๊ทธ๋ฆฌ๊ณ ๊ฒฌ๊ณ ํ ์ํ ๊ด๋ฆฌ๋ฅผ ์ดํดํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ค์ ๋งค์ฐ ์ํธ์์ฉ์ ์ด๊ณ ํ๋ ฅ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์๋ก์ด ํ๋ก์ ํธ๋ ๋ ๊ฐ์ํ๋ ์ ๊ทผ ๋ฐฉ์์ ์ฐพ๋ ๊ฒฝ์ฐ, CRDT๋ฅผ ํ์ํ๋ ๊ฒ์ ์ ๊ทน ๊ถ์ฅํฉ๋๋ค. ์ด๋ค ๊ธธ์ ์ ํํ๋ , ๋์์ฑ ์ ์ด์ ๋ถ์ฐ ์์คํ ์ ๋ํ ๊น์ ์ดํด๋ ํ์์ ์ ๋๋ค. ๋ชฉํ๋ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ํํ๊ณ ์ง๊ด์ ์ธ ๊ฒฝํ์ ๋ง๋ค์ด ๊ณต์ ๋์งํธ ๊ณต๊ฐ์ ํตํด ์์ฐ์ฑ๊ณผ ์ฐธ์ฌ๋ฅผ ์ด์งํ๋ ๊ฒ์ ๋๋ค.
ํต์ฌ ์์ฝ:
- ์ค์๊ฐ ํ์ ์ ๋์ ์์ ์ ์ฒ๋ฆฌํ๊ณ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํ ๊ฒฌ๊ณ ํ ๋ฉ์ปค๋์ฆ์ด ํ์ํฉ๋๋ค.
- ์คํผ๋ ์ด์ ๋ ํธ๋์คํฌ๋ฉ์ด์ (OT)์ ์๋ ด์ ๋ณด์ฅํ๊ธฐ ์ํด ์์ ์ ๋ณํํจ์ผ๋ก์จ ์ด๋ฅผ ๋ฌ์ฑํฉ๋๋ค.
- OT ๊ตฌํ์ ์์ ์ ์, ๋ณํ ํจ์ ์ ์, ๊ทธ๋ฆฌ๊ณ ํด๋ผ์ด์ธํธ ๊ฐ์ ์ํ ๊ด๋ฆฌ๋ฅผ ํฌํจํฉ๋๋ค.
- CRDT๋ ์ข ์ข ๋ ๊ฐ๋จํ ๊ตฌํ๊ณผ ๋ ํฐ ๊ฒฌ๊ณ ์ฑ์ ๊ฐ์ง OT์ ํ๋์ ์ธ ๋์์ ์ ๊ณตํฉ๋๋ค.
- ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ์ง์ฐ ์๊ฐ, ๊ตญ์ ํ ๋ฐ ํ์ฅ์ฑ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
- ShareDB, Yjs ๋๋ Automerge์ ๊ฐ์ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ๊ฐ๋ฐ์ ๊ฐ์ํํ์ธ์.
ํ์ ๋๊ตฌ์ ๋ํ ์์๊ฐ ๊ณ์ ์ฆ๊ฐํจ์ ๋ฐ๋ผ, ์ด๋ฌํ ๊ธฐ์ ์ ๋ง์คํฐํ๋ ๊ฒ์ ์ฐจ์ธ๋ ์ธํฐ๋ํฐ๋ธ ์น ๊ฒฝํ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ผ ๊ฒ์ ๋๋ค.